import logging
import random

from django.http import HttpResponse
# 创建类视图
from django_redis import get_redis_connection
from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView

# 图片相关参数在访问视图时已经匹配过，所以这里不用校验
# 由于不需要查询数据库,也不需要做序列化操作,所以可以直接继承APIView
from meiduo_mall.libs.captcha.captcha import captcha
from meiduo_mall.utils.yuntongxun.sms import CCP
from . import constants
from .serializers import ImageCodeCheckSerializer

# import logging
# logging.DEBUG()
# Create your views here.

logger=logging.getLogger('django')

class ImageCodeView(APIView):
    '''
    GET 请求
    接受参数
    校验参数
    生成图片
    保存图片相关数据
    返回图片
    '''
    def get(self,request,image_code_id):
        # 利用三方软件生成验证码图片,返回验证码和图片
        text,image=captcha.generate_captcha()
        print(text)
        # 向redis中保存图片,由于redis只有保存缓存和session的,所以需要配置一下
        redis_conn=get_redis_connection('verify_codes')  # 哪个数据库
        redis_conn.setex('img_%s' % image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)

        # 返回响应
        return HttpResponse(image,content_type='image/jpg')

class SMSCodeView(GenericAPIView):
    '''
    短信验证码
    参数 mobile   image_code_id,text
    '''
    serializer_class = ImageCodeCheckSerializer
    def get(self,request,mobile):
        # 校验参数
        serializer=self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        # 生成短信验证码
        sms_code='%06d' % random.randint(0,999999)
        print(sms_code)

        # 保存短信验证码,保存发送记录
        # 1.连接到数据库
        redis_conn = get_redis_connection('verify_codes')
        # 2.将数据保存到数据库里面
        # redis_conn.setex('sms_%s' % mobile,constants.SMS_CODE_REIDS_EXPIRES,sms_code)
        # # 防止用户一分钟内请求多次
        # redis_conn.setex('send_flag_%s' % mobile,constants.SEND_SMS_CODE_INTERVAL,1)

        # redis管道
        pl=redis_conn.pipeline()
        pl.setex('sms_%s' % mobile,constants.SMS_CODE_REIDS_EXPIRES,sms_code)
        pl.setex('send_flag_%s' % mobile,constants.SEND_SMS_CODE_INTERVAL,1)

        # 通知redis执行保存命令
        pl.execute()

        # 发送短信
        # try:
            # ccp=CCP()
            # expires=constants.SMS_CODE_REIDS_EXPIRES//60
            # # 如果云通讯发送信息成功,返回的字典数据result中statusCode字段的值为'000000'
            # result=ccp.send_template_sms(mobile,[sms_code,expires],constants.SMS_CODE_TEMP_ID)
        # except Exception as r:
        #     logger.error('发送短信验证码异常[mobile:%s, message:%s]' % (mobile,r))
        #     return Response({'message':'failed'},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        # else:
        #     if result==0:
        #         return Response({'message':'OK'})
        #     else:
        #         return Response({'message': 'failed'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        # 返回
        return Response({'message':'OK'})

